+2001-01-17 <alexl@redhat.com>
+
+ * gdk/linux-fb/gdkdrawable-fb2.c (gdk_shadow_fb_draw_arc):
+ Doh! Mixed up x and y.
+
+ * gdk/linux-fb/gdkglobals-fb.c:
+ Removed gdk_fb_pointer_grab_window_events,
+ added _gdk_fb_pointer_grab_owner_events and
+ _gdk_fb_keyboard_grab_owner_events.
+
+ * gdk/linux-fb/gdkmain-fb.c (gdk_fb_pointer_grab):
+ Set all button mask if GDK_BUTTON_MOTION_MASK set. Send
+ crossing events before grabbing. Set _gdk_fb_pointer_grab_owner_events.
+ (gdk_fb_pointer_ungrab): Unset _gdk_fb_pointer_grab_owner_events
+ Send crossing events after ungrab finished.
+ (gdk_keyboard_grab): Set ..._owner_events
+ (type_masks): Move out of function.
+ (gdk_fb_other_event_window, gdk_fb_pointer_event_window,
+ gdk_fb_keyboard_event_window): New functions, return the
+ window an event should be targeted at. Handles grabs and
+ event propagation. Can return NULL.
+ (gdk_event_make): Remove event_mask checking. Now always
+ returns an event.
+
+ * gdk/linux-fb/gdkkeyboard-fb.c:
+ * gdk/linux-fb/gdkproperty-fb.c:
+ * gdk/linux-fb/gdkselection-fb.c:
+ Use new event_window/gdk_event_make() behaviour.
+
+ * gdk/linux-fb/gdkmouse-fb.c:
+ Use new event_window/gdk_event_make() behaviour.
+ Only send motion events if in the same window.
+ If grabbed, use cursor from window if sibling of grabbed
+ window, and cursor from grabbed window otherwise.
+
+ * gdk/linux-fb/gdkprivate-fb.h:
+ Update gdk_fb_window_send_crossing_events, gdk_event_make
+ and grab varaible declarations. Add gdk_fb_*_event_window().
+
+ * gdk/linux-fb/gdkwindow-fb.c:
+ Use new event_window/gdk_event_make() behaviour.
+ Keep correct track of focus window.
+ (gdk_window_set_events): Set all specific button motion masks
+ if GDK_BUTTON_MOTION_MASK set.
+
+ * gtk/gtkdnd.c (gtk_drag_update):
+ Free info->last_event if gdk_drag_motion returned FALSE.
+
Tue Jan 16 13:13:13 GMT 2001 Tony Gale <gale@gtk.org>
* docs/faq/gtk-faq.sgml: FAQ update:
+2001-01-17 <alexl@redhat.com>
+
+ * gdk/linux-fb/gdkdrawable-fb2.c (gdk_shadow_fb_draw_arc):
+ Doh! Mixed up x and y.
+
+ * gdk/linux-fb/gdkglobals-fb.c:
+ Removed gdk_fb_pointer_grab_window_events,
+ added _gdk_fb_pointer_grab_owner_events and
+ _gdk_fb_keyboard_grab_owner_events.
+
+ * gdk/linux-fb/gdkmain-fb.c (gdk_fb_pointer_grab):
+ Set all button mask if GDK_BUTTON_MOTION_MASK set. Send
+ crossing events before grabbing. Set _gdk_fb_pointer_grab_owner_events.
+ (gdk_fb_pointer_ungrab): Unset _gdk_fb_pointer_grab_owner_events
+ Send crossing events after ungrab finished.
+ (gdk_keyboard_grab): Set ..._owner_events
+ (type_masks): Move out of function.
+ (gdk_fb_other_event_window, gdk_fb_pointer_event_window,
+ gdk_fb_keyboard_event_window): New functions, return the
+ window an event should be targeted at. Handles grabs and
+ event propagation. Can return NULL.
+ (gdk_event_make): Remove event_mask checking. Now always
+ returns an event.
+
+ * gdk/linux-fb/gdkkeyboard-fb.c:
+ * gdk/linux-fb/gdkproperty-fb.c:
+ * gdk/linux-fb/gdkselection-fb.c:
+ Use new event_window/gdk_event_make() behaviour.
+
+ * gdk/linux-fb/gdkmouse-fb.c:
+ Use new event_window/gdk_event_make() behaviour.
+ Only send motion events if in the same window.
+ If grabbed, use cursor from window if sibling of grabbed
+ window, and cursor from grabbed window otherwise.
+
+ * gdk/linux-fb/gdkprivate-fb.h:
+ Update gdk_fb_window_send_crossing_events, gdk_event_make
+ and grab varaible declarations. Add gdk_fb_*_event_window().
+
+ * gdk/linux-fb/gdkwindow-fb.c:
+ Use new event_window/gdk_event_make() behaviour.
+ Keep correct track of focus window.
+ (gdk_window_set_events): Set all specific button motion masks
+ if GDK_BUTTON_MOTION_MASK set.
+
+ * gtk/gtkdnd.c (gtk_drag_update):
+ Free info->last_event if gdk_drag_motion returned FALSE.
+
Tue Jan 16 13:13:13 GMT 2001 Tony Gale <gale@gtk.org>
* docs/faq/gtk-faq.sgml: FAQ update:
+2001-01-17 <alexl@redhat.com>
+
+ * gdk/linux-fb/gdkdrawable-fb2.c (gdk_shadow_fb_draw_arc):
+ Doh! Mixed up x and y.
+
+ * gdk/linux-fb/gdkglobals-fb.c:
+ Removed gdk_fb_pointer_grab_window_events,
+ added _gdk_fb_pointer_grab_owner_events and
+ _gdk_fb_keyboard_grab_owner_events.
+
+ * gdk/linux-fb/gdkmain-fb.c (gdk_fb_pointer_grab):
+ Set all button mask if GDK_BUTTON_MOTION_MASK set. Send
+ crossing events before grabbing. Set _gdk_fb_pointer_grab_owner_events.
+ (gdk_fb_pointer_ungrab): Unset _gdk_fb_pointer_grab_owner_events
+ Send crossing events after ungrab finished.
+ (gdk_keyboard_grab): Set ..._owner_events
+ (type_masks): Move out of function.
+ (gdk_fb_other_event_window, gdk_fb_pointer_event_window,
+ gdk_fb_keyboard_event_window): New functions, return the
+ window an event should be targeted at. Handles grabs and
+ event propagation. Can return NULL.
+ (gdk_event_make): Remove event_mask checking. Now always
+ returns an event.
+
+ * gdk/linux-fb/gdkkeyboard-fb.c:
+ * gdk/linux-fb/gdkproperty-fb.c:
+ * gdk/linux-fb/gdkselection-fb.c:
+ Use new event_window/gdk_event_make() behaviour.
+
+ * gdk/linux-fb/gdkmouse-fb.c:
+ Use new event_window/gdk_event_make() behaviour.
+ Only send motion events if in the same window.
+ If grabbed, use cursor from window if sibling of grabbed
+ window, and cursor from grabbed window otherwise.
+
+ * gdk/linux-fb/gdkprivate-fb.h:
+ Update gdk_fb_window_send_crossing_events, gdk_event_make
+ and grab varaible declarations. Add gdk_fb_*_event_window().
+
+ * gdk/linux-fb/gdkwindow-fb.c:
+ Use new event_window/gdk_event_make() behaviour.
+ Keep correct track of focus window.
+ (gdk_window_set_events): Set all specific button motion masks
+ if GDK_BUTTON_MOTION_MASK set.
+
+ * gtk/gtkdnd.c (gtk_drag_update):
+ Free info->last_event if gdk_drag_motion returned FALSE.
+
Tue Jan 16 13:13:13 GMT 2001 Tony Gale <gale@gtk.org>
* docs/faq/gtk-faq.sgml: FAQ update:
+2001-01-17 <alexl@redhat.com>
+
+ * gdk/linux-fb/gdkdrawable-fb2.c (gdk_shadow_fb_draw_arc):
+ Doh! Mixed up x and y.
+
+ * gdk/linux-fb/gdkglobals-fb.c:
+ Removed gdk_fb_pointer_grab_window_events,
+ added _gdk_fb_pointer_grab_owner_events and
+ _gdk_fb_keyboard_grab_owner_events.
+
+ * gdk/linux-fb/gdkmain-fb.c (gdk_fb_pointer_grab):
+ Set all button mask if GDK_BUTTON_MOTION_MASK set. Send
+ crossing events before grabbing. Set _gdk_fb_pointer_grab_owner_events.
+ (gdk_fb_pointer_ungrab): Unset _gdk_fb_pointer_grab_owner_events
+ Send crossing events after ungrab finished.
+ (gdk_keyboard_grab): Set ..._owner_events
+ (type_masks): Move out of function.
+ (gdk_fb_other_event_window, gdk_fb_pointer_event_window,
+ gdk_fb_keyboard_event_window): New functions, return the
+ window an event should be targeted at. Handles grabs and
+ event propagation. Can return NULL.
+ (gdk_event_make): Remove event_mask checking. Now always
+ returns an event.
+
+ * gdk/linux-fb/gdkkeyboard-fb.c:
+ * gdk/linux-fb/gdkproperty-fb.c:
+ * gdk/linux-fb/gdkselection-fb.c:
+ Use new event_window/gdk_event_make() behaviour.
+
+ * gdk/linux-fb/gdkmouse-fb.c:
+ Use new event_window/gdk_event_make() behaviour.
+ Only send motion events if in the same window.
+ If grabbed, use cursor from window if sibling of grabbed
+ window, and cursor from grabbed window otherwise.
+
+ * gdk/linux-fb/gdkprivate-fb.h:
+ Update gdk_fb_window_send_crossing_events, gdk_event_make
+ and grab varaible declarations. Add gdk_fb_*_event_window().
+
+ * gdk/linux-fb/gdkwindow-fb.c:
+ Use new event_window/gdk_event_make() behaviour.
+ Keep correct track of focus window.
+ (gdk_window_set_events): Set all specific button motion masks
+ if GDK_BUTTON_MOTION_MASK set.
+
+ * gtk/gtkdnd.c (gtk_drag_update):
+ Free info->last_event if gdk_drag_motion returned FALSE.
+
Tue Jan 16 13:13:13 GMT 2001 Tony Gale <gale@gtk.org>
* docs/faq/gtk-faq.sgml: FAQ update:
+2001-01-17 <alexl@redhat.com>
+
+ * gdk/linux-fb/gdkdrawable-fb2.c (gdk_shadow_fb_draw_arc):
+ Doh! Mixed up x and y.
+
+ * gdk/linux-fb/gdkglobals-fb.c:
+ Removed gdk_fb_pointer_grab_window_events,
+ added _gdk_fb_pointer_grab_owner_events and
+ _gdk_fb_keyboard_grab_owner_events.
+
+ * gdk/linux-fb/gdkmain-fb.c (gdk_fb_pointer_grab):
+ Set all button mask if GDK_BUTTON_MOTION_MASK set. Send
+ crossing events before grabbing. Set _gdk_fb_pointer_grab_owner_events.
+ (gdk_fb_pointer_ungrab): Unset _gdk_fb_pointer_grab_owner_events
+ Send crossing events after ungrab finished.
+ (gdk_keyboard_grab): Set ..._owner_events
+ (type_masks): Move out of function.
+ (gdk_fb_other_event_window, gdk_fb_pointer_event_window,
+ gdk_fb_keyboard_event_window): New functions, return the
+ window an event should be targeted at. Handles grabs and
+ event propagation. Can return NULL.
+ (gdk_event_make): Remove event_mask checking. Now always
+ returns an event.
+
+ * gdk/linux-fb/gdkkeyboard-fb.c:
+ * gdk/linux-fb/gdkproperty-fb.c:
+ * gdk/linux-fb/gdkselection-fb.c:
+ Use new event_window/gdk_event_make() behaviour.
+
+ * gdk/linux-fb/gdkmouse-fb.c:
+ Use new event_window/gdk_event_make() behaviour.
+ Only send motion events if in the same window.
+ If grabbed, use cursor from window if sibling of grabbed
+ window, and cursor from grabbed window otherwise.
+
+ * gdk/linux-fb/gdkprivate-fb.h:
+ Update gdk_fb_window_send_crossing_events, gdk_event_make
+ and grab varaible declarations. Add gdk_fb_*_event_window().
+
+ * gdk/linux-fb/gdkwindow-fb.c:
+ Use new event_window/gdk_event_make() behaviour.
+ Keep correct track of focus window.
+ (gdk_window_set_events): Set all specific button motion masks
+ if GDK_BUTTON_MOTION_MASK set.
+
+ * gtk/gtkdnd.c (gtk_drag_update):
+ Free info->last_event if gdk_drag_motion returned FALSE.
+
Tue Jan 16 13:13:13 GMT 2001 Tony Gale <gale@gtk.org>
* docs/faq/gtk-faq.sgml: FAQ update:
+2001-01-17 <alexl@redhat.com>
+
+ * gdk/linux-fb/gdkdrawable-fb2.c (gdk_shadow_fb_draw_arc):
+ Doh! Mixed up x and y.
+
+ * gdk/linux-fb/gdkglobals-fb.c:
+ Removed gdk_fb_pointer_grab_window_events,
+ added _gdk_fb_pointer_grab_owner_events and
+ _gdk_fb_keyboard_grab_owner_events.
+
+ * gdk/linux-fb/gdkmain-fb.c (gdk_fb_pointer_grab):
+ Set all button mask if GDK_BUTTON_MOTION_MASK set. Send
+ crossing events before grabbing. Set _gdk_fb_pointer_grab_owner_events.
+ (gdk_fb_pointer_ungrab): Unset _gdk_fb_pointer_grab_owner_events
+ Send crossing events after ungrab finished.
+ (gdk_keyboard_grab): Set ..._owner_events
+ (type_masks): Move out of function.
+ (gdk_fb_other_event_window, gdk_fb_pointer_event_window,
+ gdk_fb_keyboard_event_window): New functions, return the
+ window an event should be targeted at. Handles grabs and
+ event propagation. Can return NULL.
+ (gdk_event_make): Remove event_mask checking. Now always
+ returns an event.
+
+ * gdk/linux-fb/gdkkeyboard-fb.c:
+ * gdk/linux-fb/gdkproperty-fb.c:
+ * gdk/linux-fb/gdkselection-fb.c:
+ Use new event_window/gdk_event_make() behaviour.
+
+ * gdk/linux-fb/gdkmouse-fb.c:
+ Use new event_window/gdk_event_make() behaviour.
+ Only send motion events if in the same window.
+ If grabbed, use cursor from window if sibling of grabbed
+ window, and cursor from grabbed window otherwise.
+
+ * gdk/linux-fb/gdkprivate-fb.h:
+ Update gdk_fb_window_send_crossing_events, gdk_event_make
+ and grab varaible declarations. Add gdk_fb_*_event_window().
+
+ * gdk/linux-fb/gdkwindow-fb.c:
+ Use new event_window/gdk_event_make() behaviour.
+ Keep correct track of focus window.
+ (gdk_window_set_events): Set all specific button motion masks
+ if GDK_BUTTON_MOTION_MASK set.
+
+ * gtk/gtkdnd.c (gtk_drag_update):
+ Free info->last_event if gdk_drag_motion returned FALSE.
+
Tue Jan 16 13:13:13 GMT 2001 Tony Gale <gale@gtk.org>
* docs/faq/gtk-faq.sgml: FAQ update:
+2001-01-17 <alexl@redhat.com>
+
+ * gdk/linux-fb/gdkdrawable-fb2.c (gdk_shadow_fb_draw_arc):
+ Doh! Mixed up x and y.
+
+ * gdk/linux-fb/gdkglobals-fb.c:
+ Removed gdk_fb_pointer_grab_window_events,
+ added _gdk_fb_pointer_grab_owner_events and
+ _gdk_fb_keyboard_grab_owner_events.
+
+ * gdk/linux-fb/gdkmain-fb.c (gdk_fb_pointer_grab):
+ Set all button mask if GDK_BUTTON_MOTION_MASK set. Send
+ crossing events before grabbing. Set _gdk_fb_pointer_grab_owner_events.
+ (gdk_fb_pointer_ungrab): Unset _gdk_fb_pointer_grab_owner_events
+ Send crossing events after ungrab finished.
+ (gdk_keyboard_grab): Set ..._owner_events
+ (type_masks): Move out of function.
+ (gdk_fb_other_event_window, gdk_fb_pointer_event_window,
+ gdk_fb_keyboard_event_window): New functions, return the
+ window an event should be targeted at. Handles grabs and
+ event propagation. Can return NULL.
+ (gdk_event_make): Remove event_mask checking. Now always
+ returns an event.
+
+ * gdk/linux-fb/gdkkeyboard-fb.c:
+ * gdk/linux-fb/gdkproperty-fb.c:
+ * gdk/linux-fb/gdkselection-fb.c:
+ Use new event_window/gdk_event_make() behaviour.
+
+ * gdk/linux-fb/gdkmouse-fb.c:
+ Use new event_window/gdk_event_make() behaviour.
+ Only send motion events if in the same window.
+ If grabbed, use cursor from window if sibling of grabbed
+ window, and cursor from grabbed window otherwise.
+
+ * gdk/linux-fb/gdkprivate-fb.h:
+ Update gdk_fb_window_send_crossing_events, gdk_event_make
+ and grab varaible declarations. Add gdk_fb_*_event_window().
+
+ * gdk/linux-fb/gdkwindow-fb.c:
+ Use new event_window/gdk_event_make() behaviour.
+ Keep correct track of focus window.
+ (gdk_window_set_events): Set all specific button motion masks
+ if GDK_BUTTON_MOTION_MASK set.
+
+ * gtk/gtkdnd.c (gtk_drag_update):
+ Free info->last_event if gdk_drag_motion returned FALSE.
+
Tue Jan 16 13:13:13 GMT 2001 Tony Gale <gale@gtk.org>
* docs/faq/gtk-faq.sgml: FAQ update:
gint extra_width;
minx = x + private->abs_x;
- miny = x + private->abs_y;
+ miny = y + private->abs_y;
maxx = x + width + private->abs_x;
- maxy = y + height + private->abs_x;
+ maxy = y + height + private->abs_y;
if (!filled)
{
const gchar *gdk_progclass = "none";
gboolean gdk_null_window_warnings = TRUE;
-GdkWindow *_gdk_fb_pointer_grab_window, *_gdk_fb_pointer_grab_window_events, *_gdk_fb_keyboard_grab_window, *_gdk_fb_pointer_grab_confine = NULL;
+GdkWindow *_gdk_fb_pointer_grab_window, *_gdk_fb_keyboard_grab_window, *_gdk_fb_pointer_grab_confine = NULL;
+gboolean _gdk_fb_pointer_grab_owner_events;
+gboolean _gdk_fb_keyboard_grab_owner_events;
GdkEventMask _gdk_fb_pointer_grab_events, _gdk_fb_keyboard_grab_events;
GdkFBWindow *gdk_root_window = NULL;
gdk_fb_redraw_all ();
}
- win = gdk_fb_window_find_focus ();
- event = gdk_event_make (win,
- key_up ? GDK_KEY_RELEASE : GDK_KEY_PRESS,
- TRUE);
- if (event)
+ win = gdk_fb_keyboard_event_window (gdk_fb_window_find_focus (),
+ key_up ? GDK_KEY_RELEASE : GDK_KEY_PRESS);
+ if (win)
{
+ event = gdk_event_make (win,
+ key_up ? GDK_KEY_RELEASE : GDK_KEY_PRESS,
+ TRUE);
+
event->key.state = modifier_state;
event->key.keyval = keyval;
event->key.string = string;
gdk_pointer_ungrab (time);
}
+ gdk_fb_window_send_crossing_events (NULL,
+ window,
+ GDK_CROSSING_GRAB);
+
+ if (event_mask & GDK_BUTTON_MOTION_MASK)
+ event_mask |=
+ GDK_BUTTON1_MOTION_MASK |
+ GDK_BUTTON2_MOTION_MASK |
+ GDK_BUTTON3_MOTION_MASK;
+
_gdk_fb_pointer_implicit_grab = implicit_grab;
_gdk_fb_pointer_grab_window = gdk_window_ref (window);
- _gdk_fb_pointer_grab_window_events = owner_events ? NULL : _gdk_fb_pointer_grab_window;
+ _gdk_fb_pointer_grab_owner_events = owner_events;
_gdk_fb_pointer_grab_confine = confine_to ? gdk_window_ref (confine_to) : NULL;
_gdk_fb_pointer_grab_events = event_mask;
_gdk_fb_pointer_grab_cursor = cursor ? gdk_cursor_ref (cursor) : NULL;
+
+
if (cursor)
gdk_fb_cursor_reset ();
- gdk_fb_window_send_crossing_events (window,
- GDK_CROSSING_GRAB);
-
return GDK_GRAB_SUCCESS;
}
{
gboolean have_grab_cursor = _gdk_fb_pointer_grab_cursor && 1;
GdkWindow *mousewin;
+ GdkWindow *old_grab_window;
if (!_gdk_fb_pointer_grab_window)
return;
if (have_grab_cursor)
gdk_fb_cursor_reset ();
- mousewin = gdk_window_at_pointer (NULL, NULL);
- gdk_fb_window_send_crossing_events (mousewin,
- GDK_CROSSING_UNGRAB);
+ old_grab_window = _gdk_fb_pointer_grab_window;
- if (_gdk_fb_pointer_grab_window)
- gdk_window_unref (_gdk_fb_pointer_grab_window);
_gdk_fb_pointer_grab_window = NULL;
- _gdk_fb_pointer_grab_window_events = NULL;
_gdk_fb_pointer_implicit_grab = FALSE;
+
+ mousewin = gdk_window_at_pointer (NULL, NULL);
+ gdk_fb_window_send_crossing_events (old_grab_window,
+ mousewin,
+ GDK_CROSSING_UNGRAB);
+
+ if (old_grab_window)
+ gdk_window_unref (old_grab_window);
}
/*
if (_gdk_fb_pointer_grab_window)
gdk_keyboard_ungrab (time);
- if (!owner_events)
- _gdk_fb_keyboard_grab_window = gdk_window_ref (window);
+ _gdk_fb_keyboard_grab_window = gdk_window_ref (window);
+ _gdk_fb_keyboard_grab_owner_events = owner_events;
return GDK_GRAB_SUCCESS;
}
}
/* utils */
-GdkEvent *
-gdk_event_make (GdkWindow *window,
- GdkEventType type,
- gboolean append_to_queue)
-{
- static const guint type_masks[] = {
- GDK_SUBSTRUCTURE_MASK, /* GDK_DELETE = 0, */
- GDK_STRUCTURE_MASK, /* GDK_DESTROY = 1, */
- GDK_EXPOSURE_MASK, /* GDK_EXPOSE = 2, */
- GDK_POINTER_MOTION_MASK, /* GDK_MOTION_NOTIFY = 3, */
- GDK_BUTTON_PRESS_MASK, /* GDK_BUTTON_PRESS = 4, */
- GDK_BUTTON_PRESS_MASK, /* GDK_2BUTTON_PRESS = 5, */
- GDK_BUTTON_PRESS_MASK, /* GDK_3BUTTON_PRESS = 6, */
- GDK_BUTTON_RELEASE_MASK, /* GDK_BUTTON_RELEASE = 7, */
- GDK_KEY_PRESS_MASK, /* GDK_KEY_PRESS = 8, */
- GDK_KEY_RELEASE_MASK, /* GDK_KEY_RELEASE = 9, */
- GDK_ENTER_NOTIFY_MASK, /* GDK_ENTER_NOTIFY = 10, */
- GDK_LEAVE_NOTIFY_MASK, /* GDK_LEAVE_NOTIFY = 11, */
- GDK_FOCUS_CHANGE_MASK, /* GDK_FOCUS_CHANGE = 12, */
- GDK_STRUCTURE_MASK, /* GDK_CONFIGURE = 13, */
- GDK_VISIBILITY_NOTIFY_MASK, /* GDK_MAP = 14, */
- GDK_VISIBILITY_NOTIFY_MASK, /* GDK_UNMAP = 15, */
- GDK_PROPERTY_CHANGE_MASK, /* GDK_PROPERTY_NOTIFY = 16, */
- GDK_PROPERTY_CHANGE_MASK, /* GDK_SELECTION_CLEAR = 17, */
- GDK_PROPERTY_CHANGE_MASK, /* GDK_SELECTION_REQUEST = 18, */
- GDK_PROPERTY_CHANGE_MASK, /* GDK_SELECTION_NOTIFY = 19, */
- GDK_PROXIMITY_IN_MASK, /* GDK_PROXIMITY_IN = 20, */
- GDK_PROXIMITY_OUT_MASK, /* GDK_PROXIMITY_OUT = 21, */
- GDK_ALL_EVENTS_MASK, /* GDK_DRAG_ENTER = 22, */
- GDK_ALL_EVENTS_MASK, /* GDK_DRAG_LEAVE = 23, */
- GDK_ALL_EVENTS_MASK, /* GDK_DRAG_MOTION = 24, */
- GDK_ALL_EVENTS_MASK, /* GDK_DRAG_STATUS = 25, */
- GDK_ALL_EVENTS_MASK, /* GDK_DROP_START = 26, */
- GDK_ALL_EVENTS_MASK, /* GDK_DROP_FINISHED = 27, */
- GDK_ALL_EVENTS_MASK, /* GDK_CLIENT_EVENT = 28, */
- GDK_VISIBILITY_NOTIFY_MASK, /* GDK_VISIBILITY_NOTIFY = 29, */
- GDK_EXPOSURE_MASK, /* GDK_NO_EXPOSE = 30, */
- GDK_SCROLL_MASK /* GDK_SCROLL = 31 */
- };
- guint evmask;
-
- evmask = GDK_WINDOW_IMPL_FBDATA(window)->event_mask;
+static const guint type_masks[] = {
+ GDK_SUBSTRUCTURE_MASK, /* GDK_DELETE = 0, */
+ GDK_STRUCTURE_MASK, /* GDK_DESTROY = 1, */
+ GDK_EXPOSURE_MASK, /* GDK_EXPOSE = 2, */
+ GDK_POINTER_MOTION_MASK, /* GDK_MOTION_NOTIFY = 3, */
+ GDK_BUTTON_PRESS_MASK, /* GDK_BUTTON_PRESS = 4, */
+ GDK_BUTTON_PRESS_MASK, /* GDK_2BUTTON_PRESS = 5, */
+ GDK_BUTTON_PRESS_MASK, /* GDK_3BUTTON_PRESS = 6, */
+ GDK_BUTTON_RELEASE_MASK, /* GDK_BUTTON_RELEASE = 7, */
+ GDK_KEY_PRESS_MASK, /* GDK_KEY_PRESS = 8, */
+ GDK_KEY_RELEASE_MASK, /* GDK_KEY_RELEASE = 9, */
+ GDK_ENTER_NOTIFY_MASK, /* GDK_ENTER_NOTIFY = 10, */
+ GDK_LEAVE_NOTIFY_MASK, /* GDK_LEAVE_NOTIFY = 11, */
+ GDK_FOCUS_CHANGE_MASK, /* GDK_FOCUS_CHANGE = 12, */
+ GDK_STRUCTURE_MASK, /* GDK_CONFIGURE = 13, */
+ GDK_VISIBILITY_NOTIFY_MASK, /* GDK_MAP = 14, */
+ GDK_VISIBILITY_NOTIFY_MASK, /* GDK_UNMAP = 15, */
+ GDK_PROPERTY_CHANGE_MASK, /* GDK_PROPERTY_NOTIFY = 16, */
+ GDK_PROPERTY_CHANGE_MASK, /* GDK_SELECTION_CLEAR = 17, */
+ GDK_PROPERTY_CHANGE_MASK, /* GDK_SELECTION_REQUEST = 18, */
+ GDK_PROPERTY_CHANGE_MASK, /* GDK_SELECTION_NOTIFY = 19, */
+ GDK_PROXIMITY_IN_MASK, /* GDK_PROXIMITY_IN = 20, */
+ GDK_PROXIMITY_OUT_MASK, /* GDK_PROXIMITY_OUT = 21, */
+ GDK_ALL_EVENTS_MASK, /* GDK_DRAG_ENTER = 22, */
+ GDK_ALL_EVENTS_MASK, /* GDK_DRAG_LEAVE = 23, */
+ GDK_ALL_EVENTS_MASK, /* GDK_DRAG_MOTION = 24, */
+ GDK_ALL_EVENTS_MASK, /* GDK_DRAG_STATUS = 25, */
+ GDK_ALL_EVENTS_MASK, /* GDK_DROP_START = 26, */
+ GDK_ALL_EVENTS_MASK, /* GDK_DROP_FINISHED = 27, */
+ GDK_ALL_EVENTS_MASK, /* GDK_CLIENT_EVENT = 28, */
+ GDK_VISIBILITY_NOTIFY_MASK, /* GDK_VISIBILITY_NOTIFY = 29, */
+ GDK_EXPOSURE_MASK, /* GDK_NO_EXPOSE = 30, */
+ GDK_SCROLL_MASK /* GDK_SCROLL = 31 */
+};
- /* Bad hack to make sure that things work semi-properly with owner_events */
- if (_gdk_fb_pointer_grab_window)
- evmask |= _gdk_fb_pointer_grab_events;
- if (_gdk_fb_keyboard_grab_window)
- evmask |= _gdk_fb_keyboard_grab_events;
+GdkWindow *
+gdk_fb_other_event_window (GdkWindow *window,
+ GdkEventType type)
+{
+ guint32 evmask;
+ GdkWindow *w;
- if (evmask & GDK_BUTTON_MOTION_MASK)
+ w = window;
+ while (w != gdk_parent_root)
{
- evmask |= GDK_BUTTON1_MOTION_MASK|GDK_BUTTON2_MOTION_MASK|GDK_BUTTON3_MOTION_MASK;
+ /* Huge hack, so that we don't propagate events to GtkWindow->frame */
+ if ((w != window) &&
+ (GDK_WINDOW_P (w)->window_type != GDK_WINDOW_CHILD) &&
+ (g_object_get_data (G_OBJECT (w), "gdk-window-child-handler")))
+ break;
+
+ evmask = GDK_WINDOW_IMPL_FBDATA(window)->event_mask;
+
+ if (evmask & type_masks[type])
+ return w;
+
+ w = gdk_window_get_parent (w);
}
+
+ return NULL;
+}
- if (evmask & (GDK_BUTTON1_MOTION_MASK|GDK_BUTTON2_MOTION_MASK|GDK_BUTTON3_MOTION_MASK))
+GdkWindow *
+gdk_fb_pointer_event_window (GdkWindow *window,
+ GdkEventType type)
+{
+ guint evmask;
+ GdkModifierType mask;
+ GdkWindow *w;
+
+ gdk_fb_mouse_get_info (NULL, NULL, &mask);
+
+ if (_gdk_fb_pointer_grab_window &&
+ !_gdk_fb_pointer_grab_owner_events)
{
- GdkModifierType mask;
+ evmask = _gdk_fb_pointer_grab_events;
- gdk_fb_mouse_get_info (NULL, NULL, &mask);
+ if (evmask & (GDK_BUTTON1_MOTION_MASK | GDK_BUTTON2_MOTION_MASK | GDK_BUTTON3_MOTION_MASK))
+ {
+ if (((mask & GDK_BUTTON1_MASK) && (evmask & GDK_BUTTON1_MOTION_MASK)) ||
+ ((mask & GDK_BUTTON2_MASK) && (evmask & GDK_BUTTON2_MOTION_MASK)) ||
+ ((mask & GDK_BUTTON3_MASK) && (evmask & GDK_BUTTON3_MOTION_MASK)))
+ evmask |= GDK_POINTER_MOTION_MASK;
+ }
- if (((mask & GDK_BUTTON1_MASK) && (evmask & GDK_BUTTON1_MOTION_MASK)) ||
- ((mask & GDK_BUTTON2_MASK) && (evmask & GDK_BUTTON2_MOTION_MASK)) ||
- ((mask & GDK_BUTTON3_MASK) && (evmask & GDK_BUTTON3_MOTION_MASK)))
- evmask |= GDK_POINTER_MOTION_MASK;
+ if (evmask & type_masks[type])
+ return _gdk_fb_pointer_grab_window;
+ else
+ return NULL;
}
- if (evmask & type_masks[type])
+ w = window;
+ while (w != gdk_parent_root)
{
- GdkEvent *event = gdk_event_new ();
- guint32 the_time;
-
- the_time = gdk_fb_get_time ();
-
- event->any.type = type;
- event->any.window = gdk_window_ref (window);
- event->any.send_event = FALSE;
- switch (type)
- {
- case GDK_MOTION_NOTIFY:
- event->motion.time = the_time;
- event->motion.axes = NULL;
- break;
- case GDK_BUTTON_PRESS:
- case GDK_2BUTTON_PRESS:
- case GDK_3BUTTON_PRESS:
- case GDK_BUTTON_RELEASE:
- event->button.time = the_time;
- event->button.axes = NULL;
- break;
- case GDK_KEY_PRESS:
- case GDK_KEY_RELEASE:
- event->key.time = the_time;
- break;
- case GDK_ENTER_NOTIFY:
- case GDK_LEAVE_NOTIFY:
- event->crossing.time = the_time;
+ /* Huge hack, so that we don't propagate events to GtkWindow->frame */
+ if ((w != window) &&
+ (GDK_WINDOW_P (w)->window_type != GDK_WINDOW_CHILD) &&
+ (g_object_get_data (G_OBJECT (w), "gdk-window-child-handler")))
break;
+
+ evmask = GDK_WINDOW_IMPL_FBDATA(window)->event_mask;
- case GDK_PROPERTY_NOTIFY:
- event->property.time = the_time;
- break;
+ if (evmask & (GDK_BUTTON1_MOTION_MASK | GDK_BUTTON2_MOTION_MASK | GDK_BUTTON3_MOTION_MASK))
+ {
+ if (((mask & GDK_BUTTON1_MASK) && (evmask & GDK_BUTTON1_MOTION_MASK)) ||
+ ((mask & GDK_BUTTON2_MASK) && (evmask & GDK_BUTTON2_MOTION_MASK)) ||
+ ((mask & GDK_BUTTON3_MASK) && (evmask & GDK_BUTTON3_MOTION_MASK)))
+ evmask |= GDK_POINTER_MOTION_MASK;
+ }
- case GDK_SELECTION_CLEAR:
- case GDK_SELECTION_REQUEST:
- case GDK_SELECTION_NOTIFY:
- event->selection.time = the_time;
- break;
- case GDK_PROXIMITY_IN:
- case GDK_PROXIMITY_OUT:
- event->proximity.time = the_time;
- break;
- case GDK_DRAG_ENTER:
- case GDK_DRAG_LEAVE:
- case GDK_DRAG_MOTION:
- case GDK_DRAG_STATUS:
- case GDK_DROP_START:
- case GDK_DROP_FINISHED:
- event->dnd.time = the_time;
- break;
+ if (evmask & type_masks[type])
+ return w;
+
+ w = gdk_window_get_parent (w);
+ }
- case GDK_FOCUS_CHANGE:
- case GDK_CONFIGURE:
- case GDK_MAP:
- case GDK_UNMAP:
- case GDK_CLIENT_EVENT:
- case GDK_VISIBILITY_NOTIFY:
- case GDK_NO_EXPOSE:
- case GDK_SCROLL:
- case GDK_DELETE:
- case GDK_DESTROY:
- case GDK_EXPOSE:
- default:
- break;
+ if (_gdk_fb_pointer_grab_window &&
+ _gdk_fb_pointer_grab_owner_events)
+ {
+ evmask = _gdk_fb_pointer_grab_events;
+
+ if (evmask & (GDK_BUTTON1_MOTION_MASK | GDK_BUTTON2_MOTION_MASK | GDK_BUTTON3_MOTION_MASK))
+ {
+ if (((mask & GDK_BUTTON1_MASK) && (evmask & GDK_BUTTON1_MOTION_MASK)) ||
+ ((mask & GDK_BUTTON2_MASK) && (evmask & GDK_BUTTON2_MOTION_MASK)) ||
+ ((mask & GDK_BUTTON3_MASK) && (evmask & GDK_BUTTON3_MOTION_MASK)))
+ evmask |= GDK_POINTER_MOTION_MASK;
}
+
+ if (evmask & type_masks[type])
+ return _gdk_fb_pointer_grab_window;
+ }
+
+ return NULL;
+}
- if (append_to_queue)
- gdk_event_queue_append (event);
+GdkWindow *
+gdk_fb_keyboard_event_window (GdkWindow *window,
+ GdkEventType type)
+{
+ guint32 evmask;
+ GdkWindow *w;
+
+ if (_gdk_fb_keyboard_grab_window &&
+ !_gdk_fb_keyboard_grab_owner_events)
+ {
+ return _gdk_fb_keyboard_grab_window;
+ }
+
+ w = window;
+ while (w != gdk_parent_root)
+ {
+ /* Huge hack, so that we don't propagate events to GtkWindow->frame */
+ if ((w != window) &&
+ (GDK_WINDOW_P (w)->window_type != GDK_WINDOW_CHILD) &&
+ (g_object_get_data (G_OBJECT (w), "gdk-window-child-handler")))
+ break;
+
+ evmask = GDK_WINDOW_IMPL_FBDATA(window)->event_mask;
- return event;
+ if (evmask & type_masks[type])
+ return w;
+
+ w = gdk_window_get_parent (w);
+ }
+
+ if (_gdk_fb_keyboard_grab_window &&
+ _gdk_fb_keyboard_grab_owner_events)
+ {
+ return _gdk_fb_keyboard_grab_window;
}
return NULL;
}
+GdkEvent *
+gdk_event_make (GdkWindow *window,
+ GdkEventType type,
+ gboolean append_to_queue)
+{
+ GdkEvent *event = gdk_event_new ();
+ guint32 the_time;
+
+ the_time = gdk_fb_get_time ();
+
+ event->any.type = type;
+ event->any.window = gdk_window_ref (window);
+ event->any.send_event = FALSE;
+ switch (type)
+ {
+ case GDK_MOTION_NOTIFY:
+ event->motion.time = the_time;
+ event->motion.axes = NULL;
+ break;
+ case GDK_BUTTON_PRESS:
+ case GDK_2BUTTON_PRESS:
+ case GDK_3BUTTON_PRESS:
+ case GDK_BUTTON_RELEASE:
+ event->button.time = the_time;
+ event->button.axes = NULL;
+ break;
+ case GDK_KEY_PRESS:
+ case GDK_KEY_RELEASE:
+ event->key.time = the_time;
+ break;
+ case GDK_ENTER_NOTIFY:
+ case GDK_LEAVE_NOTIFY:
+ event->crossing.time = the_time;
+ break;
+
+ case GDK_PROPERTY_NOTIFY:
+ event->property.time = the_time;
+ break;
+
+ case GDK_SELECTION_CLEAR:
+ case GDK_SELECTION_REQUEST:
+ case GDK_SELECTION_NOTIFY:
+ event->selection.time = the_time;
+ break;
+ case GDK_PROXIMITY_IN:
+ case GDK_PROXIMITY_OUT:
+ event->proximity.time = the_time;
+ break;
+ case GDK_DRAG_ENTER:
+ case GDK_DRAG_LEAVE:
+ case GDK_DRAG_MOTION:
+ case GDK_DRAG_STATUS:
+ case GDK_DROP_START:
+ case GDK_DROP_FINISHED:
+ event->dnd.time = the_time;
+ break;
+
+ case GDK_FOCUS_CHANGE:
+ case GDK_CONFIGURE:
+ case GDK_MAP:
+ case GDK_UNMAP:
+ case GDK_CLIENT_EVENT:
+ case GDK_VISIBILITY_NOTIFY:
+ case GDK_NO_EXPOSE:
+ case GDK_SCROLL:
+ case GDK_DELETE:
+ case GDK_DESTROY:
+ case GDK_EXPOSE:
+ default:
+ break;
+ }
+
+ if (append_to_queue)
+ gdk_event_queue_append (event);
+
+ return event;
+}
+
void
gdk_fb_set_rotation (GdkFBAngle angle)
{
GdkWindow *mousewin;
GdkEvent *event;
gint x, y;
- GdkWindow *win, *grabwin;
+ GdkWindow *old_win, *win, *event_win, *cursor_win;
guint state;
GdkDrawableFBData *mousewin_private;
+ old_win = gdk_window_at_pointer (NULL, NULL);
+
if (_gdk_fb_pointer_grab_confine)
mousewin = _gdk_fb_pointer_grab_confine;
else
mouse->y = mousewin_private->lim_y - 1;
win = gdk_window_at_pointer (NULL, NULL);
- if (_gdk_fb_pointer_grab_window_events)
- grabwin = _gdk_fb_pointer_grab_window_events;
- else
- grabwin = win;
-
- gdk_fb_cursor_move (mouse->x, mouse->y, grabwin);
+
+ cursor_win = win;
+ if (_gdk_fb_pointer_grab_window)
+ {
+ GdkWindow *w;
+
+ cursor_win = _gdk_fb_pointer_grab_window;
+ w = win;
+ while (w != gdk_parent_root)
+ {
+ if (w == _gdk_fb_pointer_grab_window)
+ {
+ cursor_win = win;
+ break;
+ }
+ w = gdk_window_get_parent (w);
+ }
+ }
- gdk_window_get_origin (grabwin, &x, &y);
- x = mouse->x - x;
- y = mouse->y - y;
+ gdk_fb_cursor_move (mouse->x, mouse->y, cursor_win);
- state = (mouse->button_pressed[0]?GDK_BUTTON1_MASK:0) |
- (mouse->button_pressed[1]?GDK_BUTTON2_MASK:0) |
- (mouse->button_pressed[2]?GDK_BUTTON3_MASK:0) |
- gdk_fb_keyboard_modifiers ();
+ event_win = gdk_fb_pointer_event_window (win, GDK_MOTION_NOTIFY);
- event = gdk_event_make (grabwin, GDK_MOTION_NOTIFY, TRUE);
- if (event)
+ if (event_win && (win == old_win))
{
+ /* Only send motion events in the same window */
+ gdk_window_get_origin (event_win, &x, &y);
+ x = mouse->x - x;
+ y = mouse->y - y;
+
+ state = (mouse->button_pressed[0]?GDK_BUTTON1_MASK:0) |
+ (mouse->button_pressed[1]?GDK_BUTTON2_MASK:0) |
+ (mouse->button_pressed[2]?GDK_BUTTON3_MASK:0) |
+ gdk_fb_keyboard_modifiers ();
+
+ event = gdk_event_make (event_win, GDK_MOTION_NOTIFY, TRUE);
event->motion.x = x;
event->motion.y = y;
event->motion.state = state;
event->motion.x_root = mouse->x;
event->motion.y_root = mouse->y;
}
-
- gdk_fb_window_send_crossing_events (win, GDK_CROSSING_NORMAL);
+
+ gdk_fb_window_send_crossing_events (NULL, win, GDK_CROSSING_NORMAL);
}
static void
{
GdkEvent *event;
gint x, y, i;
- GdkWindow *window;
+ GdkWindow *mouse_win;
+ GdkWindow *event_win;
int nbuttons;
- if (_gdk_fb_pointer_grab_window_events)
- window = _gdk_fb_pointer_grab_window_events;
- else
- window = gdk_window_at_pointer(NULL, NULL);
-
- event = gdk_event_make (window, press_event ? GDK_BUTTON_PRESS : GDK_BUTTON_RELEASE, FALSE);
-
- if (event)
+
+ mouse_win = gdk_window_at_pointer(NULL, NULL);
+ event_win = gdk_fb_pointer_event_window (mouse_win,
+ press_event ? GDK_BUTTON_PRESS : GDK_BUTTON_RELEASE);
+
+ if (event_win)
{
- gdk_window_get_origin (window, &x, &y);
+ event = gdk_event_make (event_win, press_event ? GDK_BUTTON_PRESS : GDK_BUTTON_RELEASE, FALSE);
+
+ gdk_window_get_origin (event_win, &x, &y);
x = mouse->x - x;
y = mouse->y - y;
/* Handle implicit button grabs: */
if (press_event && nbuttons == 1)
{
- gdk_fb_pointer_grab (window, FALSE,
- gdk_window_get_events (window),
+ gdk_fb_pointer_grab (mouse_win, FALSE,
+ gdk_window_get_events (mouse_win),
NULL, NULL,
GDK_CURRENT_TIME, TRUE);
mouse->click_grab = TRUE;
GdkRegion *region);
void gdk_window_invalidate_rect_clear (GdkWindow *window,
GdkRectangle *rect);
-void gdk_fb_window_send_crossing_events (GdkWindow *dest,
+void gdk_fb_window_send_crossing_events (GdkWindow *src,
+ GdkWindow *dest,
GdkCrossingMode mode);
void gdk_fb_window_move_resize (GdkWindow *window,
gint x,
extern GdkFBAngle _gdk_fb_screen_angle;
-extern GdkWindow *_gdk_fb_pointer_grab_window, *_gdk_fb_pointer_grab_window_events, *_gdk_fb_keyboard_grab_window, *_gdk_fb_pointer_grab_confine;
-extern GdkEventMask _gdk_fb_pointer_grab_events, _gdk_fb_keyboard_grab_events;
+/* Pointer grab info */
+extern GdkWindow *_gdk_fb_pointer_grab_window;
+extern gboolean _gdk_fb_pointer_grab_owner_events;
+extern GdkWindow *_gdk_fb_pointer_grab_confine;
+extern GdkEventMask _gdk_fb_pointer_grab_events;
extern GdkCursor *_gdk_fb_pointer_grab_cursor;
+/* Keyboard grab info */
+extern GdkWindow *_gdk_fb_keyboard_grab_window;
+extern GdkEventMask _gdk_fb_keyboard_grab_events;
+extern gboolean _gdk_fb_keyboard_grab_owner_events;
+
extern GdkFBDisplay *gdk_display;
extern GdkDrawableClass _gdk_fb_drawable_class;
extern FILE *debug_out;
-GdkEvent *gdk_event_make(GdkWindow *window, GdkEventType type, gboolean append_to_queue);
-GdkEvent *gdk_event_make_2(GdkWindow *window, GdkEventType type, gboolean append_to_queue, gint button_press_num);
+GdkEvent *gdk_event_make(GdkWindow *window,
+ GdkEventType type,
+ gboolean append_to_queue);
+GdkWindow * gdk_fb_pointer_event_window (GdkWindow *window,
+ GdkEventType type);
+GdkWindow *gdk_fb_keyboard_event_window (GdkWindow *window,
+ GdkEventType type);
+GdkWindow *gdk_fb_other_event_window (GdkWindow *window,
+ GdkEventType type);
void gdk_fb_get_cursor_rect(GdkRectangle *rect);
gboolean gdk_fb_cursor_need_hide(GdkRectangle *rect);
{
GdkWindowFBData *fbd = GDK_WINDOW_IMPL_FBDATA(window);
GdkEvent *event;
+ GdkWindow *event_window;
g_hash_table_remove (fbd->properties, GUINT_TO_POINTER (property));
g_free (prop);
- event = gdk_event_make (window, GDK_PROPERTY_NOTIFY, TRUE);
- if (event)
+ event_window = gdk_fb_other_event_window (window, GDK_PROPERTY_NOTIFY);
+ if (event_window)
{
+ event = gdk_event_make (event_window, GDK_PROPERTY_NOTIFY, TRUE);
event->property.atom = property;
event->property.state = GDK_PROPERTY_DELETE;
}
GdkWindowProperty *prop, *new_prop;
int new_size = 0;
GdkEvent *event;
+ GdkWindow *event_window;
g_return_if_fail (window != NULL);
g_return_if_fail (GDK_IS_WINDOW (window));
g_hash_table_insert (fbd->properties, GUINT_TO_POINTER (property), new_prop);
g_free (prop);
- event = gdk_event_make (window, GDK_PROPERTY_NOTIFY, TRUE);
- if (event)
+ event_window = gdk_fb_other_event_window (window, GDK_PROPERTY_NOTIFY);
+ if (event_window)
{
+ event = gdk_event_make (event_window, GDK_PROPERTY_NOTIFY, TRUE);
event->property.atom = property;
event->property.state = GDK_PROPERTY_NEW_VALUE;
}
{
GdkEvent *event;
GdkWindow *owner;
+ GdkWindow *event_window;
owner = gdk_selection_owner_get (selection);
if (owner)
{
- event = gdk_event_make (owner, GDK_SELECTION_REQUEST, TRUE);
- if (event)
+ event_window = gdk_fb_other_event_window (owner, GDK_SELECTION_REQUEST);
+ if (event_window)
{
+ event = gdk_event_make (event_window, GDK_SELECTION_REQUEST, TRUE);
event->selection.requestor = requestor;
event->selection.selection = selection;
event->selection.target = target;
guint32 time)
{
GdkEvent *event;
+ GdkWindow *event_window;
- event = gdk_event_make (gdk_window_lookup (requestor), GDK_SELECTION_NOTIFY, TRUE);
- if (event)
+ event_window = gdk_fb_other_event_window (gdk_window_lookup (requestor), GDK_SELECTION_NOTIFY);
+ if (event_window)
{
+ event = gdk_event_make (event_window, GDK_SELECTION_NOTIFY, TRUE);
event->selection.selection = selection;
event->selection.target = target;
event->selection.property = property;
/* Global variables: */
static GdkWindow *gdk_fb_window_containing_pointer = NULL;
+static GdkWindow *gdk_fb_focused_window = NULL;
static gpointer parent_class = NULL;
static void recompute_drawable (GdkDrawable *drawable);
{
GList *l;
GdkWindow *parent = (GdkWindow *)private->parent;
-
+ GdkWindow *event_win;
+
g_assert (is_map);
if (!private->mapped)
return;
if (is_map)
- gdk_event_make ((GdkWindow *)private, GDK_MAP, TRUE);
-
+ {
+ event_win = gdk_fb_other_event_window ((GdkWindow *)private, GDK_MAP);
+ if (event_win)
+ gdk_event_make (event_win, GDK_MAP, TRUE);
+ }
if (private->input_only)
return;
/* Focus follows pointer */
-GdkWindow *
-_gdk_fb_window_find_focus (GdkWindow *window_with_mouse)
+static GdkWindow *
+gdk_fb_window_find_toplevel (GdkWindow *window)
{
- if (_gdk_fb_keyboard_grab_window)
- return _gdk_fb_keyboard_grab_window;
- else if (window_with_mouse)
+ GdkWindowObject *priv = (GdkWindowObject *)window;
+ while (priv != (GdkWindowObject *)gdk_parent_root)
{
- GdkWindowObject *priv = (GdkWindowObject *)window_with_mouse;
- while (priv != (GdkWindowObject *)gdk_parent_root)
- {
- if ((priv->parent == (GdkWindowObject *)gdk_parent_root) && priv->mapped)
- return (GdkWindow *)priv;
- priv = priv->parent;
- }
+ if ((priv->parent == (GdkWindowObject *)gdk_parent_root) && priv->mapped)
+ return (GdkWindow *)priv;
+ priv = priv->parent;
}
return gdk_parent_root;
GdkWindow *
gdk_fb_window_find_focus (void)
{
- return _gdk_fb_window_find_focus (gdk_fb_window_containing_pointer);
+ if (_gdk_fb_keyboard_grab_window)
+ return _gdk_fb_keyboard_grab_window;
+
+ if (!gdk_fb_focused_window)
+ gdk_fb_focused_window = gdk_parent_root;
+
+ return gdk_fb_focused_window;
}
static void
-gdk_fb_send_focus_change (GdkWindow *old_window_containing_pointer,
- GdkWindow *new_window_containing_pointer)
+gdk_fb_change_focus (GdkWindow *new_focus_window)
{
GdkEventFocus *event;
GdkWindow *old_win, *new_win;
- old_win = _gdk_fb_window_find_focus (old_window_containing_pointer);
- new_win = _gdk_fb_window_find_focus (new_window_containing_pointer);
+ GdkWindow *event_win;
+
+ /* No focus changes while the pointer is grabbed */
+ if (_gdk_fb_pointer_grab_window)
+ return;
+
+ old_win = gdk_fb_focused_window;
+ new_win = gdk_fb_window_find_toplevel (new_focus_window);
if (old_win != new_win)
{
- event = (GdkEventFocus *)gdk_event_make (old_win, GDK_FOCUS_CHANGE, TRUE);
- if (event)
- event->in = FALSE;
- event = (GdkEventFocus *)gdk_event_make (new_win, GDK_FOCUS_CHANGE, TRUE);
- if (event)
- event->in = TRUE;
+ if (old_win)
+ {
+ event_win = gdk_fb_keyboard_event_window (old_win, GDK_FOCUS_CHANGE);
+ if (event_win)
+ {
+ event = (GdkEventFocus *)gdk_event_make (event_win, GDK_FOCUS_CHANGE, TRUE);
+ event->in = FALSE;
+ }
+ }
+ event_win = gdk_fb_keyboard_event_window (new_win, GDK_FOCUS_CHANGE);
+ if (event_win)
+ {
+ event = (GdkEventFocus *)gdk_event_make (event_win, GDK_FOCUS_CHANGE, TRUE);
+ event->in = TRUE;
+ }
}
+ gdk_fb_focused_window = new_win;
}
static GdkWindow *
}
void
-gdk_fb_window_send_crossing_events (GdkWindow *dest,
+gdk_fb_window_send_crossing_events (GdkWindow *src,
+ GdkWindow *dest,
GdkCrossingMode mode)
{
GdkWindow *c;
GdkModifierType my_mask;
GList *path, *list;
gboolean non_linear;
- gboolean only_grabbed_window;
GdkWindow *a;
GdkWindow *b;
+ GdkWindow *event_win;
if ((mode == GDK_CROSSING_NORMAL) &&
(dest == gdk_fb_window_containing_pointer))
if (gdk_fb_window_containing_pointer == NULL)
gdk_fb_window_containing_pointer = gdk_window_ref (gdk_parent_root);
- if (mode == GDK_CROSSING_UNGRAB)
- a = _gdk_fb_pointer_grab_window;
+ if (src)
+ a = src;
else
a = gdk_fb_window_containing_pointer;
b = dest;
- /* When grab in progress only send normal crossing events about
- * the grabbed window.
- */
- only_grabbed_window = (_gdk_fb_pointer_grab_window_events != NULL) &&
- (mode == GDK_CROSSING_NORMAL);
-
if (a==b)
return;
non_linear = (c != a) && (c != b);
- if (!only_grabbed_window || (a == _gdk_fb_pointer_grab_window))
- event = gdk_event_make (a, GDK_LEAVE_NOTIFY, TRUE);
- else
- event = NULL;
- if (event)
+ event_win = gdk_fb_pointer_event_window (a, GDK_LEAVE_NOTIFY);
+ if (event_win)
{
+ event = gdk_event_make (event_win, GDK_LEAVE_NOTIFY, TRUE);
event->crossing.subwindow = NULL;
gdk_window_get_root_origin (a, &x_int, &y_int);
event->crossing.x = x - x_int;
win = GDK_WINDOW (GDK_WINDOW_OBJECT (a)->parent);
while (win != c)
{
- if (!only_grabbed_window || (win == _gdk_fb_pointer_grab_window))
- event = gdk_event_make (win, GDK_LEAVE_NOTIFY, TRUE);
- else
- event = NULL;
- if (event)
+ event_win = gdk_fb_pointer_event_window (win, GDK_LEAVE_NOTIFY);
+ if (event_win)
{
+ event = gdk_event_make (event_win, GDK_LEAVE_NOTIFY, TRUE);
event->crossing.subwindow = gdk_window_ref (last);
gdk_window_get_root_origin (win, &x_int, &y_int);
event->crossing.x = x - x_int;
else
next = b;
- if (!only_grabbed_window || (win == _gdk_fb_pointer_grab_window))
- event = gdk_event_make (win, GDK_ENTER_NOTIFY, TRUE);
- else
- event = NULL;
- if (event)
+ event_win = gdk_fb_pointer_event_window (win, GDK_ENTER_NOTIFY);
+ if (event_win)
{
+ event = gdk_event_make (event_win, GDK_ENTER_NOTIFY, TRUE);
event->crossing.subwindow = gdk_window_ref (next);
gdk_window_get_root_origin (win, &x_int, &y_int);
event->crossing.x = x - x_int;
g_list_free (path);
}
- if (!only_grabbed_window || (b == _gdk_fb_pointer_grab_window))
- event = gdk_event_make (b, GDK_ENTER_NOTIFY, TRUE);
- else
- event = NULL;
- if (event)
+ event_win = gdk_fb_pointer_event_window (b, GDK_ENTER_NOTIFY);
+ if (event_win)
{
+ event = gdk_event_make (event_win, GDK_ENTER_NOTIFY, TRUE);
event->crossing.subwindow = NULL;
gdk_window_get_root_origin (b, &x_int, &y_int);
event->crossing.x = x - x_int;
event->crossing.state = my_mask;
}
- if ((mode != GDK_CROSSING_GRAB) &&
- (b != gdk_fb_window_containing_pointer) &&
- !only_grabbed_window)
+ if (mode != GDK_CROSSING_GRAB)
{
- gdk_fb_send_focus_change (gdk_fb_window_containing_pointer, b);
- gdk_window_unref (gdk_fb_window_containing_pointer);
- gdk_fb_window_containing_pointer = gdk_window_ref (b);
+ gdk_fb_change_focus (b);
+ if (b != gdk_fb_window_containing_pointer)
+ {
+ gdk_window_unref (gdk_fb_window_containing_pointer);
+ gdk_fb_window_containing_pointer = gdk_window_ref (b);
+ }
}
}
send_map_events (private, TRUE);
mousewin = gdk_window_at_pointer (NULL, NULL);
- gdk_fb_window_send_crossing_events (mousewin,
+ gdk_fb_window_send_crossing_events (NULL,
+ mousewin,
GDK_CROSSING_NORMAL);
if (private->input_only)
{
GdkWindowObject *private;
GdkWindow *mousewin;
+ GdkWindow *event_win;
g_return_if_fail (window != NULL);
GdkRectangle r;
gboolean do_hide;
- event = gdk_event_make (window, GDK_UNMAP, TRUE);
+ event_win = gdk_fb_other_event_window (window, GDK_UNMAP);
+ if (event_win)
+ event = gdk_event_make (event_win, GDK_UNMAP, TRUE);
r.x = GDK_DRAWABLE_IMPL_FBDATA (window)->llim_x;
r.y = GDK_DRAWABLE_IMPL_FBDATA (window)->llim_y;
private->mapped = FALSE;
mousewin = gdk_window_at_pointer (NULL, NULL);
- gdk_fb_window_send_crossing_events (mousewin,
+ gdk_fb_window_send_crossing_events (NULL,
+ mousewin,
GDK_CROSSING_NORMAL);
do_hide = gdk_fb_cursor_need_hide (&r);
/* Send GdkEventConfigure for toplevel windows */
if (private->window_type != GDK_WINDOW_CHILD)
{
- event = gdk_event_make (window, GDK_CONFIGURE, TRUE);
- if (event)
+ GdkWindow *event_win;
+ event_win = gdk_fb_other_event_window (window, GDK_CONFIGURE);
+ if (event_win)
{
+ event = gdk_event_make (event_win, GDK_CONFIGURE, TRUE);
event->configure.x = private->x;
event->configure.y = private->y;
event->configure.width = GDK_DRAWABLE_IMPL_FBDATA (private)->width;
/* The window the pointer is in might have changed */
mousewin = gdk_window_at_pointer (NULL, NULL);
- gdk_fb_window_send_crossing_events (mousewin,
+ gdk_fb_window_send_crossing_events (NULL,
+ mousewin,
GDK_CROSSING_NORMAL);
}
}
g_return_if_fail (window != NULL);
g_return_if_fail (GDK_IS_WINDOW (window));
+
+ if (event_mask & GDK_BUTTON_MOTION_MASK)
+ event_mask |=
+ GDK_BUTTON1_MOTION_MASK | GDK_BUTTON2_MOTION_MASK |
+ GDK_BUTTON3_MOTION_MASK;
if (!GDK_WINDOW_DESTROYED (window))
GDK_WINDOW_IMPL_FBDATA (window)->event_mask = event_mask;
x_root, y_root, action,
possible_actions,
time))
+ {
+ if (info->last_event != event) /* Paranoia, should not happen */
+ {
+ if (info->last_event)
+ gdk_event_free ((GdkEvent *)info->last_event);
+ info->last_event = gdk_event_copy ((GdkEvent *)event);
+ }
+ }
+ else
{
if (info->last_event)
- gdk_event_free ((GdkEvent *)info->last_event);
-
- info->last_event = gdk_event_copy ((GdkEvent *)event);
+ {
+ gdk_event_free ((GdkEvent *)info->last_event);
+ info->last_event = NULL;
+ }
}
-
+
if (dest_window)
gdk_window_unref (dest_window);